package mvc;
import java.util.*;
import java.lang.Cloneable;

/**
 * @author   marcos @date 29/05/2007
 * Esta classe eh responsavel por toda a comunicacao com o banco de dados
 */
public class BancoDeDados implements BancoDeDadosInterface{

	LinkedList<String> CepList = new LinkedList<String>();
	LinkedList<String> TipoExame = new LinkedList<String>();
	LinkedList<String> MedicosList = new LinkedList<String>();
	LinkedList<User> UsersList = new LinkedList<User>();
	LinkedList<Agenda> AgendaList = new LinkedList<Agenda>();

	/* Construtor */
	public BancoDeDados() {


	}

	public void addCEP(String CEP) {
		try {
			if(!CepList.contains(CEP)) {
				CepList.add(CEP);
			}
		}
		catch(Exception exception) {
			//return false;
		}
	}

	public void addMedico(String Medico) {
		try {
			if(!MedicosList.contains(Medico)) {
				Agenda f=null;
				MedicosList.add(Medico);

				/* Cria a agenda para o Medico */
				f = new Agenda();
				f.setNomeMedico(Medico);
				AgendaList.add(f);
			
			}
		}
		catch(Exception exception) {
			//return false;
		}
	}

	public void removeMedico(String Medico) {
		Agenda f=null;
		int i;
		
		/* Procura e remove a agenda do medico */
		for(i=0; i<=AgendaList.size(); i++) {
			f=AgendaList.get(i);
			if(f.getNomeMedico().equals(Medico)) {
				AgendaList.remove(i);
				break;
			}
		}
		
		/* Remove o medico da lista */
		MedicosList.remove(Medico);
	}


	public String addProntuario(String nome, String dataNasc, String CPF, String RG,
			String endereco,String bairro,String cidade, String estado,String t1,
			String t2, String t3, String CEP, String dataCadast, String estadoCivil) {

		User e = new User();
		e.setProntuario(Integer.toString(UsersList.size()+1));
		e.setNome(nome);
		e.setDataNasc(dataNasc);
		e.setCPF(CPF);
		e.setRG(RG);
		e.setEndereco(endereco);
		e.setCEP(CEP);
		e.setBairro(bairro);
		e.setCidade(cidade);
		e.setEstado(estado);
		e.setT1(t1);
		e.setT2(t2);
		e.setT3(t3);
		e.setDataCadast(dataCadast);
		e.setEstadoCivil(estadoCivil);

		/* Adiciona o usuario na lista */
		UsersList.add(e);

		/* Retorna  o numero do prontuario */
		return e.Prontuario;
	}


	public void addTipoExame(String tipoExame) {
		try {
			if(!TipoExame.contains(tipoExame)) {
				TipoExame.add(tipoExame);
			}
		}
		catch(Exception exception) {
			//return false;
		}

	}

	/* Return true caso o cep for encontrado na lista
	 * Return false caso nao encontrado
	 */
	public boolean buscaCEP(String CEP) {
		return CepList.contains(CEP);
	}


	public User buscaProntuario(String str) {
		int i;
		User a;

		/* Procura o usuario */
		for(i=0; i<=UsersList.size(); i++) {
			a=UsersList.get(i);
			if(a.getRG().equals(str)) {
				/* Retorna o usuario encontrado */
				return a;
			}
		}

		return null;
	}


	public String buscaTipoExame() {
		String exa="";
		int i;
		String a;

		/* Retorna os tipos de exame na forma de String: "Tipo1;Tipo2;..." */
		for(i=0; i<TipoExame.size(); i++) {
			a = TipoExame.get(i);
			exa = exa + a + ";";
		}

		return exa;

	}


	public Agenda consultaAgenda(String nomeMedico, int dia, int mes, int ano) {
		Agenda agenda = null;

		//POG: rocambole, mas funciona
		for(Agenda x: AgendaList) {
			if(x.nomeMedico.equals(nomeMedico)) {
				agenda=new Agenda();
				for(Compromisso y : x.CompromissoList) {
					if(y.getDia() == dia && y.getMes() == mes && y.getAno() == ano) {
						Compromisso z=(Compromisso) y.clone();
						agenda.CompromissoList.add(z);
					} // if interno
				} //for interno
			} //if externo
		} // for externo
		return agenda;
	}


	public String getMedicos() {
		String med="";
		int i;
		String a;

		/* Retorna os medicos cadastrados na forma de String: "Medico1;Medico2;..." */
		for(i=0; i<=MedicosList.size(); i++) {
			a = MedicosList.get(i);
			med = med + a + ";";
		}

		return med;

	}


	public void insereConsulta(String nomeMedico, String prontuario, int dia, int mes, int ano, int hora) {
		int i;
		Agenda f=null;

		/* Busca a agenda do medico */
		for(i=0; i<=AgendaList.size(); i++) {
			f=AgendaList.get(i);
			if(f.getNomeMedico().equals(nomeMedico))
				break;
		}

		/* Insere o compromisso */
		Compromisso c1 = new Compromisso();
		c1.setAno(ano);
		c1.setMes(mes);
		c1.setDia(dia);
		c1.setHora(hora);
		c1.setProntuario(prontuario);

		f.addCompromisso(c1);

		AgendaList.set(i, f);

	}

	public void removeConsulta(String nomeMedico, int dia, int mes, int ano, int hora) {
		int i;
		Agenda f=null;
		Compromisso c=null;
		
		/* Busca a agenda do medico */
		for(i=0; i<=AgendaList.size(); i++) {
			f=AgendaList.get(i);
			if(f.getNomeMedico().equals(nomeMedico))
				break;
		}
		
		/* Busca o compromisso indicado */
		for(i=0; i<=f.CompromissoList.size(); i++) {
			c=f.CompromissoList.get(i);
			if(c.getDia()==dia && c.getMes()==mes && c.getAno()==ano && c.getHora()==hora) {
				/* Se achar remove o compromisso */
				f.CompromissoList.remove(i);
				break;
			}
		}
		
	}


	public void removeCEP(String CEP) {	
		CepList.remove(CEP);
	}


	public void removeProntuario(String prontuario) {
		int i;
		User a;

		/* Busca o usuario */
		for(i=0; i<=UsersList.size(); i++) {
			a=UsersList.get(i);
			if(a.getProntuario().equals(prontuario)) {
				/* Remove quando achar */
				UsersList.remove(i);
				break;
			}
		}

	}

	public static void main(String args[]) {
		BancoDeDados bd= new BancoDeDados();
		String a;

		/* Teste cep */
		bd.addCEP("02757-030");
		bd.addCEP("02756-030");
		bd.addCEP("02755-030");
		bd.addCEP("02754-030");

		if(bd.buscaCEP("02757-030")) {
			System.out.println("CEP Encontrado");
		}
		else
			System.out.println("CEP Nao encontrado");

		bd.removeCEP("02757-030");

		if(bd.buscaCEP("02757-030")) {
			System.out.println("CEP Encontrado");
		}
		else
			System.out.println("CEP Nao encontrado");


		// -----------------------------------

		/* Teste de adicao de medicos */
		bd.addMedico("Mario");
		bd.addMedico("Aline");
		bd.addMedico("Sueli");
		bd.addMedico("Suelen");

		a = bd.getMedicos();
		System.out.println(a);

		bd.removeMedico("Suelen");

		a = bd.getMedicos();
		System.out.println(a);

		/* Teste de adicao de Tipo de Exames */
		bd.addTipoExame("Oftalmologico");
		bd.addTipoExame("Endocrino");
		bd.addTipoExame("Pediatra");
		bd.addTipoExame("Psicologo");

		a = bd.buscaTipoExame();
		System.out.println(a);

		/* Teste de adicao de usuario */
		a = bd.addProntuario("Marcos", "01/01/2000", "123", "456", "Rua Registro", "02757-030", "Vila Bancaria", "Sao Paulo", "SP", "123", "456", "", "31/05/2007","0");
		System.out.println(a);
		a = bd.addProntuario("Marcel", "02/01/2000", "123", "456", "Rua Registro", "02757-030", "Vila Bancaria", "Sao Paulo", "SP", "123", "456", "", "30/01/2003","0");
		System.out.println(a);
		a = bd.addProntuario("Maria", "03/01/2000", "123", "456", "Rua Registro", "02757-030", "Vila Bancaria", "Sao Paulo", "SP", "123", "456", "", "01/01/2004","0");
		System.out.println(a);
		a = bd.addProntuario("Marcelo", "04/01/2000", "123", "456", "Rua Registro", "02757-030", "Vila Bancaria", "Sao Paulo", "SP", "123", "456", "", "04/12/2002","0");
		System.out.println(a);
		a = bd.addProntuario("Marcia", "05/01/2000", "123", "456", "Rua Registro", "02757-030", "Vila Bancaria", "Sao Paulo", "SP", "123", "456", "", "11/10/2001","0");
		System.out.println(a);

		User c1=bd.buscaProntuario("2");

		if(c1!=null && c1.getProntuario().equals("2")) {
			System.out.println("Usuario Encontrado");
		}
		else
			System.out.println("Usuario Nao encontrado");

		bd.removeProntuario("2");

		c1=bd.buscaProntuario("2");

		if(c1!=null && c1.getProntuario().equals("2")) {
			System.out.println("Usuario Encontrado");
		}
		else
			System.out.println("Usuario Nao encontrado");


		// -----------------------------------



	}
}

class User {
	String Prontuario; 	// Prontuario: Numero sequencial
	String Nome;	   	// Nome do usuario
	String Exame;	   	// Exames
	String Endereco;   	// Endereco completo
	String RG;	   	// RG do usuario
	String CPF;		// CPF do usuario
	boolean Enc;	// Caso encaminhado de outra unidade
	String DataNasc;	// Data de nascimento DD/MM/AAAA
	String Medico;		// Nome do medico atendente
	String Especialidade; // Especialidade atendida
	boolean PendDeExame;	// Resultado de exames pendentes
	String CEP;		// CEP do usuario
	String Bairro;
	String Cidade;
	String Estado;
	String t1, t2, t3;
	String DataCadast;
	String estadoCivil;

	public User() {
		Enc=false;
		PendDeExame=false;
	}

	public String getDataNasc() {
		return DataNasc;
	}
	public void setDataNasc(String dataNasc) {
		DataNasc = dataNasc;
	}
	public boolean isEnc() {
		return Enc;
	}
	public void setEnc(boolean enc) {
		Enc = enc;
	}
	public String getEndereco() {
		return Endereco;
	}
	public void setEndereco(String endereco) {
		Endereco = endereco;
	}
	public String getEspecialidade() {
		return Especialidade;
	}
	public void setEspecialidade(String especialidade) {
		Especialidade = especialidade;
	}
	public String getExame() {
		return Exame;
	}
	public void setExame(String exame) {
		Exame = exame;
	}
	public String getMedico() {
		return Medico;
	}
	public void setMedico(String medico) {
		Medico = medico;
	}
	public String getNome() {
		return Nome;
	}
	public void setNome(String nome) {
		Nome = nome;
	}
	public boolean isPendDeExame() {
		return PendDeExame;
	}
	public void setPendDeExame(boolean pendDeExame) {
		PendDeExame = pendDeExame;
	}
	public String getProntuario() {
		return Prontuario;
	}
	public void setProntuario(String prontuario) {
		Prontuario = prontuario;
	}
	public String getCPF() {
		return CPF;
	}
	public void setCPF(String cpf) {
		CPF = cpf;
	}
	public String getRG() {
		return RG;
	}
	public void setRG(String rg) {
		RG = rg;
	}
	public String getCEP() {
		return CEP;
	}
	public void setCEP(String cep) {
		CEP = cep;
	}

	public String getBairro() {
		return Bairro;
	}

	public void setBairro(String bairro) {
		Bairro = bairro;
	}

	public String getCidade() {
		return Cidade;
	}

	public void setCidade(String cidade) {
		Cidade = cidade;
	}

	public String getEstado() {
		return Estado;
	}

	public void setEstado(String estado) {
		Estado = estado;
	}

	public String getT1() {
		return t1;
	}

	public void setT1(String t1) {
		this.t1 = t1;
	}

	public String getT2() {
		return t2;
	}

	public void setT2(String t2) {
		this.t2 = t2;
	}

	public String getT3() {
		return t3;
	}

	public void setT3(String t3) {
		this.t3 = t3;
	}

	public String getDataCadast() {
		return DataCadast;
	}

	public void setDataCadast(String dataCadast) {
		DataCadast = dataCadast;
	}

	public String getEstadoCivil() {
		return estadoCivil;
	}

	public void setEstadoCivil(String estadoCivil) {
		this.estadoCivil = estadoCivil;
	}

}

class Agenda {
	String nomeMedico;
	LinkedList<Compromisso> CompromissoList = new LinkedList<Compromisso>();

	public void addCompromisso(Compromisso c1) {
		CompromissoList.add(c1);
	}

	public String getNomeMedico() {
		return nomeMedico;
	}
	public void setNomeMedico(String nomeMedico) {
		this.nomeMedico = nomeMedico;
	}
}

class Compromisso implements Cloneable {

	// facilita a copia do objeto desta classe
	 public Object clone() {
			try {
				return super.clone();
			}
			catch (CloneNotSupportedException e) {
				// This should never happen
				throw new InternalError(e.toString());
			}
		}

	String Prontuario;
	int dia, mes, ano, hora;

	public int getAno() {
		return ano;
	}
	public void setAno(int ano) {
		this.ano = ano;
	}
	public int getDia() {
		return dia;
	}
	public void setDia(int dia) {
		this.dia = dia;
	}
	public int getHora() {
		return hora;
	}
	public void setHora(int hora) {
		this.hora = hora;
	}
	public int getMes() {
		return mes;
	}
	public void setMes(int mes) {
		this.mes = mes;
	}
	public String getProntuario() {
		return Prontuario;
	}
	public void setProntuario(String prontuario) {
		Prontuario = prontuario;
	}

}
